package com.company.Tree;

import javax.swing.plaf.nimbus.AbstractRegionPainter;
import java.util.Arrays;

/**
 * @author VX5
 * @Title: MJC
 * @ProjectName DataStructure
 * @Description: TODO
 * @date ${DAT}13:28
 */
public class HeapSort {
    public static void main(String[] args) {
        int arr[] = {4,6,8,5,9};
        heapSort(arr);
    }

    //编写贴个堆排序的方法
    public static void heapSort(int[] arr){
        int temp = 0;
        System.out.println("堆排序！");
//        adjustHeap(arr,1,arr.length);
//        System.out.println(Arrays.toString(arr));
//        adjustHeap(arr,0,arr.length);
//        System.out.println(Arrays.toString(arr));
        for (int i = arr.length / 2 - 1; i >= 0; i--){
            adjustHeap(arr,i,arr.length);
        }
        System.out.println(Arrays.toString(arr));

        for (int j = arr.length -1;j>0;j--){
            //交换
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr,0,j);//之前从最下面开始排  现在从顶上开始排
        }
        System.out.println(Arrays.toString(arr));
    }
    //将一个数组（二叉树）调整成一个大顶堆


    /**
     * 完成将 以i对应的非叶子节点的树调整成大顶堆
     *
     * @param arr 待调整的数组
     * @param i 表示非叶子节点在数组中的索引
     * @param lenght 表示多个元素继续调整，length是在逐渐的减少
     */
    public static void adjustHeap(int[] arr,int i,int lenght){
        int temp = arr[i];
        for (int k = i * 2 + 1;k < lenght;k = k * 2 + 1) {
            if (arr[k]<arr[k+1]){
                k++;
            }
            if (temp < arr[k]){
                arr[i] = arr[k];
                i = k;
            }else {
                break;
            }
        }
        arr[i] = temp;
    }
}
